/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package otcapp.experto;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import otcapp.dto.InternoDTO;
import otcapp.entidades.Interno;
import otcapp.experto.excepciones.ExpertoInternoException;
import persistencia.Fachada;

/**
 *
 * @author diego
 */
public class ExpertoConsultarInterno extends Experto{
    
    private List<Interno> listaInternosEncontrados;
    /**
     * Busca los internos en la base de datos por nombre y apellido
     *
     * @param nombre
     * @param apellido
     * @return Regresa un listado con todos los internos que coinciden con el
     * criterio de busqueda.
     */
    public List<InternoDTO> buscarInterno(InternoDTO dtoBusqueda) throws ExpertoInternoException {

        if (dtoBusqueda == null) {
            return crearDTOInterno(Fachada.getInstancia().buscar(Interno.class, null));
        }

        Criteria criterio = Fachada.getInstancia().crearCriterio(Interno.class);
        criterio.addOrder(Order.asc("apellido"));

        if (dtoBusqueda.getDni().length() > 0) {
            criterio.add(Restrictions.eq("dni", dtoBusqueda.getDni()));
            listaInternosEncontrados = Fachada.getInstancia().buscar(Interno.class, criterio);
        } else if (dtoBusqueda.getNombre().length() > 0 && dtoBusqueda.getApellido().length() > 0) {
            criterio.add(Restrictions.ilike("nombre", "%" + dtoBusqueda.getNombre() + "%"));
            criterio.add(Restrictions.ilike("apellido", "%" + dtoBusqueda.getApellido() + "%"));
            listaInternosEncontrados = Fachada.getInstancia().buscar(Interno.class, criterio);
        } else if (dtoBusqueda.getApellido().length() > 0) {
            criterio.add(Restrictions.ilike("apellido", "%" + dtoBusqueda.getApellido() + "%"));
            listaInternosEncontrados = Fachada.getInstancia().buscar(Interno.class, criterio);
        } else if (dtoBusqueda.getNombre().length() > 0) {
            criterio.add(Restrictions.ilike("nombre", "%" + dtoBusqueda.getNombre() + "%"));
            listaInternosEncontrados = Fachada.getInstancia().buscar(Interno.class, criterio);
        } else {
            throw new ExpertoInternoException("No se han ingresado datos para la búsqueda.");
        }

        if (listaInternosEncontrados.isEmpty()) {
            throw new ExpertoInternoException("No se han encontrado Internos, para los datos ingresados.");
        }

        return crearDTOInterno(listaInternosEncontrados);
    }

    public InternoDTO crearDTOInterno(Interno interno) {

        InternoDTO dto = new InternoDTO();
        dto.setApellido(interno.getApellido());
        dto.setNombre(interno.getNombre());
        dto.setDni(interno.getDni());
        dto.setId(interno.getId());

        return dto;

    }

    public List<InternoDTO> crearDTOInterno(List<Interno> listaInterno) {
        List<InternoDTO> internosDTO = new ArrayList<>();
        for (Iterator<Interno> it = listaInterno.iterator(); it.hasNext();) {
            Interno interno = it.next();
            InternoDTO dto = crearDTOInterno(interno);
            internosDTO.add(dto);
        }

        return internosDTO;

    }

    protected Interno buscarInternoXid(Long idInterno) {

        if (listaInternosEncontrados != null) {
            for (Iterator<Interno> it = listaInternosEncontrados.iterator(); it.hasNext();) {
                Interno interno = it.next();
                if (interno.getId().equals(idInterno)) {
                    return interno;
                }
            }
        }
        Criteria criterio = Fachada.getInstancia().crearCriterio(Interno.class);
        criterio.add(Restrictions.eq("id", idInterno));

        return (Interno) Fachada.getInstancia().buscar(Interno.class, criterio).get(0);

    }
    
}
